package com.lsy.on_line.zaixian.utils;

import com.lsy.on_line.zaixian.model.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * JWT封装工具类
 *      1.生成的token是可以通过使用base64进行解密出明文信息的
 *      2.base64进行解密出的明文信息，修改在进行编码，则会解密失败
 *      3.无法作废已颁布的token令牌，除非更改秘钥 SECRET
 */
public class JWTUtils {

    /**
     * 过期时间,一周
     */
    private static final  long EXPIRE = 6000 * 60 * 24 * 7;
    /**
     * 加密秘钥
     */
    private static  final  String SECRET = "SyClass.net168";

    /**
     * 令牌前缀
     */
    private static  final  String TOKEN_PREFIX = "SyClass";

    /**
     * subject
     */
    private static  final  String SUBJECT = "SyClass";

    /**
     * 根据用户信息，生成令牌
     * @param user
     * @return
     */
    public static String geneJsonWebToken(User user){
        String token = Jwts.builder().setSubject(SUBJECT)//主题
                .claim("head_img",user.getHeadImg())
                .claim("id",user.getId())
                .claim("name",user.getName())
                .setIssuedAt(new Date())//设置生效时间
                .setExpiration(new Date(System.currentTimeMillis()+EXPIRE))//设置过期时间
                .signWith(SignatureAlgorithm.HS256,SECRET).compact();//加密算法

        token = TOKEN_PREFIX + token;//令牌token拼接

        return token;
    }


    /**
     * 校验token 获取token中的用户信息
     * @param token
     * @return
     */
    public static Claims claimsJWT(String token){
        try {
            final Claims claims = Jwts.parser().setSigningKey(SECRET)//设置解密需要的秘钥
                    .parseClaimsJws(token.replace(TOKEN_PREFIX,""))//替换前缀
                    .getBody();//获取token串

            return claims;
        }catch (Exception e){
            return null;
        }
    }


}
